package com.liwie.app;
//阻塞、唤醒、终断
//利用Interrupter信号，唤醒阻塞的线程，从而达到进入异常的目的，最终可以完成线程的终断
//1——被终断线程未开启，则myApp4.t1.interrupt();无效

//myApp4.t1.isInterrupted();该方法判断是否终端了，执行完毕之后会清除终端信号

//1——默认没有终断信号（就是个0值）
//2——在线程开启后，利用当前线程对象的interrupt()添加终断信号（就是修改个值为1），一次只能终断一个阻塞，且终断后还原终断信号值（变为0）
//3——在线程中可以使用Thread.interrupted();判断终断信号是否为1（如果是1则true,如果是0则false）,且改变终断值为默认值（0）
//4——在线程中可以使用当前线程对象的.isInterrupted();判断终断信号是否为1（如果是1则true,如果是0则false）,且改变终断值为原值
public class MyApp4 {
    boolean run = true;

    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i <= 10; i++) {
                if (i == 5) {
                    try {
                        Thread.currentThread().join();
                    } catch (InterruptedException e) {
//                        e.printStackTrace();
                        System.out.println("Thread.currentThread().join():收到中断信号.........................");
                        //新添加的信号量
                        Thread.currentThread().interrupt();
                        //静态方法Thread.interrupted()会清除信号量
                        //ClearInterrupted参数表达为，是否清除信号量，如果是true，则清除，如果是false则不清除
                        //boolean interrupted = Thread.interrupted();
                        boolean interrupted = Thread.currentThread().isInterrupted();
                        System.out.println("interrupted:" + interrupted);
                    }


                    try {
                        Thread.sleep(50000);
                    } catch (InterruptedException e) {
//                        e.printStackTrace();
                        System.out.println(" Thread.sleep(50000):收到中断信号.........................");
                    }

                }
                System.out.println(i);
            }
        }
    };
    Thread t1 = new Thread(r1, "r1");


    Thread threadMain;

    public static void main(String[] args) {
        MyApp4 myApp4 = new MyApp4();
        myApp4.threadMain = Thread.currentThread();
        myApp4.t1.start();
        try {
            Thread.sleep(5000);
            //发出t1线程中断信号
            myApp4.t1.interrupt();
            System.out.println("中断信号以及发出.........................");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
